﻿# -*-coding:utf-8-*-
from random import random

import requests
import re
import time
import pandas as pd
import xlrd
from xlutils.copy import copy
from lxml import etree  # xpath

user_agent = [
    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
    "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
    "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    "Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    "Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    "MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    "Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10",
    "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
    "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+",
    "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0",
    "Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)",
    "UCWEB7.0.2.37/28/999",
    "NOKIA5700/ UCWEB7.0.2.37/28/999",
    "Openwave/ UCWEB7.0.2.37/28/999",
    "Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999",
    "Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25",

]

headers = {
    'Referer': 'https://music.163.com',
    'User-Agent': random.choice(user_agent)
}


def get_page(url):
    index = 0
    res = requests.get(url, headers=headers)
    data = re.findall('<a title="(.*?)" href="/playlist\?id=(\d+)" class="msk"></a>', res.text)
    for item in data:
        index = get_songs(item, index)
    return index


def get_songs(data, index):
    playlist_url = 'https://music.163.com/playlist?id=%s' % data[1]

    res = requests.get(playlist_url, headers=headers)
    obj_nodes = etree.HTML(res.text)
    node_texts = obj_nodes.xpath('//div[@id="song-list-pre-cache"]//a/@href')
    if len(node_texts) > 0:
        for nodeText in node_texts:
            re.findall(r'id=(\d+)', nodeText)
            if 'id=' in nodeText:
                temp_text = nodeText.split('id=')
                if temp_text[1] not in list:
                    download_mp3(data, temp_text[1], index)
                    index += 1
    return index


def get_music_info(song_id, index, num):
    music_url = 'https://music.163.com/song?id=%s' % song_id
    res = requests.get(music_url, headers=headers)

    obj_nodes = etree.HTML(res.text)
    img = obj_nodes.xpath('//img/@data-src')
    title = obj_nodes.xpath('//em[@class="f-ff2"]/text()')
    author = obj_nodes.xpath('//div[@class="cnt"]//span/@title')
    lrc = obj_nodes.xpath('//div[@id="lyric-content"]/text()')

    print('当前id:%s,歌曲是：%s的%s，他的图片是%s' % (song_id, author, title, img))

    xlsx = xlrd.open_workbook(r'../excel/music.xls', formatting_info=True)
    wb = copy(xlsx)
    ws = wb.get_sheet(num)

    ws.write(index, 0, song_id)
    ws.write(index, 1, title)
    ws.write(index, 2, author)
    ws.write(index, 3, img)
    ws.write(index, 4, lrc)

    wb.save("fomatting.xlsx")


def read_excel():
    dfxm = pd.read_excel(r'songId.xlsx')
    df = dfxm['song_id'].astype(str)

    list = []

    for i in df:
        list.append(i)

    return list


def download_mp3(data, song_id, index):
    download_url = "http://music.163.com/song/media/outer/url?id=%s" % song_id
    try:
        print("正在下载%s:%s下的歌曲：%s,第%s首歌" % (data[1], data[0], song_id, index))
        with open('G:\\MP3\\yueyu\\' + song_id + '.mp3', 'wb') as f:
            f.write(requests.get(download_url, headers=headers).content)
    except FileNotFoundError:
        pass
    except OSError:
        pass


if __name__ == '__main__':
    startTime = time.time()
    limit = 35
    for num in range(0, 38):
        offset = num * limit
        hot_url = 'https://music.163.com/discover/playlist/?order=粤语&cat=全部&limit=%s&offset=%s' % (limit, offset)
        get_page(hot_url, num)
    time.time() - startTime
    print("爬取数据成功，用时%s" % (time.time() - startTime))
